/**
 * 2010(c) Copyright Oceansoft Information System Co.,LTD. All rights reserved.
 * <p>
 * Compile: JDK 1.6+
 * <p>
 * 版权所有(C)：江苏欧索软件有限公司
 * <p>
 * 公司名称：江苏欧索软件有限公司
 * <p>
 * 公司地址：中国苏州科技城青山路1号
 * <p>
 * 网址: http://www.oceansoft.com.cn
 * <p>
 * 作者: 090922(陈伟)
 * <p>
 * 文件名: com.oceansoft.mobile.econsole.common.util.charset.UnicodeUtil.java 
 * <p>
 * 类产生时间: 2014-7-25 0025 下午 12:48
 * <p>
 * 负责人: 090922(陈伟)
 * <p>
 * Email:javacspring@gmail.com
 * <p>
 * 所在组 : 掌上公安应用平台
 * <p>
 * 所在部门: 开发部--手持技术部
 * <p>
 * <p>
 */
package cn.com.oceansoft.nos.common.util.charset;

/**
 * Unicode转换工具类
 *
 * @author: chenw
 * @time: 2013-4-17 09:21
 */
public class UnicodeUtil {

    /**
     * 中文转Unicode
     *
     * @param zhStr 中文字符串
     * @return Unicode字符串
     */
    public static String encodeUnicode(final String zhStr) {
        char[] chars = zhStr.toCharArray();
        StringBuilder result = new StringBuilder(chars.length);
        for (char c : chars) {
            String hexB = Integer.toHexString(c);
            if (hexB.length() <= 2) {
                hexB = "00" + hexB;
            }
            result.append(String.format("\\u%s", hexB));
        }
        return result.toString();
    }

    /**
     * Unicode字符转中文
     *
     * @param unicodeStr Unicode字符串
     * @return 中文字符串
     */
    private static String decodeUnicode(String unicodeStr) {
        char[] in = unicodeStr.toCharArray();
        int len = in.length;
        int off = 0;
        char c;
        char[] out = new char[len];
        int outLen = 0;
        while (off < len) {
            c = in[off++];
            if (c == '\\') {
                if (len > off) { // 是否有下一个字符
                    c = in[off++]; // 取出下一个字符
                } else {
                    out[outLen++] = '\\'; // 末字符为'\'，返回
                    break;
                }
                if (c == 'u') { // 如果是"\\u"
                    int value = 0;
                    if (len > off + 4) { // 判断"\\u"后边是否有四个字符
                        boolean isUnicode = true;
                        for (int i = 0; i < 4; i++) { // 遍历四个字符
                            c = in[off++];
                            switch (c) {
                                case '0':
                                case '1':
                                case '2':
                                case '3':
                                case '4':
                                case '5':
                                case '6':
                                case '7':
                                case '8':
                                case '9':
                                    value = (value << 4) + c - '0';
                                    break;
                                case 'a':
                                case 'b':
                                case 'c':
                                case 'd':
                                case 'e':
                                case 'f':
                                    value = (value << 4) + 10 + c - 'a';
                                    break;
                                case 'A':
                                case 'B':
                                case 'C':
                                case 'D':
                                case 'E':
                                case 'F':
                                    value = (value << 4) + 10 + c - 'A';
                                    break;
                                default:
                                    isUnicode = false; // 判断是否为unicode码
                            }
                        }
                        if (isUnicode) { // 是unicode码转换为字符
                            out[outLen++] = (char) value;
                        } else { // 不是unicode码把"\\uXXXX"填入返回值
                            off = off - 4;
                            out[outLen++] = '\\';
                            out[outLen++] = 'u';
                            out[outLen++] = in[off++];
                        }
                    } else { // 不够四个字符则把"\\u"放入返回结果并继续
                        out[outLen++] = '\\';
                        out[outLen++] = 'u';
                    }
                } else {
                    switch (c) { // 判断"\\"后边是否接特殊字符，回车，tab一类的
                        case 't':
                            c = '\t';
                            out[outLen++] = c;
                            break;
                        case 'r':
                            c = '\r';
                            out[outLen++] = c;
                            break;
                        case 'n':
                            c = '\n';
                            out[outLen++] = c;
                            break;
                        case 'f':
                            c = '\f';
                            out[outLen++] = c;
                            break;
                        default:
                            out[outLen++] = '\\';
                            out[outLen++] = c;
                            break;
                    }
                }
            } else {
                out[outLen++] = c;
            }
        }
        return new String(out, 0, outLen);
    }

    public static void main(String[] args) {
        System.out.println("\n\nencodeUnicode===>" + encodeUnicode("中华人民共和国") + "\n\n");
        System.out.println("\n\ndecodeUnicode===>" + decodeUnicode("\u4e2d\u534e\u4eba\u6c11\u5171\u548c\u56fd"));
    }
}
